package com.example.vote.flow.service.impl;

import com.example.vote.flow.exception.ServiceException;
import com.example.vote.flow.mapper.VoteOptionMapper;
import com.example.vote.flow.mapper.VoteTopicMapper;
import com.example.vote.flow.pojo.core.Principle;
import com.example.vote.flow.pojo.entity.VoteTopic;
import com.example.vote.flow.pojo.param.VoteTopicCreateParam;
import com.example.vote.flow.pojo.param.VoteTopicUpdateParam;
import com.example.vote.flow.pojo.vo.VoteOptionSimpleVO;
import com.example.vote.flow.pojo.vo.VoteTopicFullVO;
import com.example.vote.flow.pojo.vo.VoteTopicSimpleVO;
import com.example.vote.flow.service.IVoteTopicService;
import com.example.vote.flow.web.StateCode;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Service
public class VoteTopicServiceImpl implements IVoteTopicService {

    @Autowired
    private VoteTopicMapper voteTopicMapper;
    @Autowired
    private VoteOptionMapper voteOptionMapper;

    @Override
    public void create(VoteTopicCreateParam param, Principle principle) {
        // 创建一个新的投票主题对象，并从参数对象中复制属性
        VoteTopic voteTopic = new VoteTopic();
        BeanUtils.copyProperties(param, voteTopic);
        // 初始化记录计数为0，表示当前投票主题尚未收到任何投票
        voteTopic.setRecordCount(0);
        // 设置创建者的ID
        voteTopic.setCreatorId(principle.getId());

        // 将投票主题对象插入到数据库中
        voteTopicMapper.insert(voteTopic);
    }

    @Override
    public void deleteById(Long id, Principle principle) {
        // 根据ID查询投票主题简要信息
        VoteTopicSimpleVO findResult = voteTopicMapper.selectById(id);
        // 如果投票主题不存在，则抛出异常
        if (findResult == null) {
            throw new ServiceException(StateCode.ERROR_NOT_FOUND, "投票主题不存在");
        }

        // 检查当前用户是否是管理员或投票主题的创建者
        if (principle.getIsAdmin() == 0 && findResult.getCreatorId().longValue() != principle.getId().longValue()) {
            throw new ServiceException(StateCode.ERROR_FORBIDDEN, "不可删除他人创建的投票主题");
        }

        // 检查投票主题是否已经开始
        if (findResult.getStartTime().isAfter(LocalDateTime.now())) {
            throw new ServiceException(StateCode.ERROR_CONFLICT, "不可删除已经开始的投票");
        }

        // 删除投票主题
        voteTopicMapper.deleteById(id);
        // 同时删除与该投票主题关联的所有投票选项
        voteOptionMapper.deleteByVoteTopicId(id);
    }

    @Override
    public int updateById(Long id, VoteTopicUpdateParam param, Principle principle) {
        // 根据ID查询投票主题简要信息
        VoteTopicSimpleVO findResult = voteTopicMapper.selectById(id);
        // 如果投票主题不存在，则抛出异常
        if (findResult == null) {
            throw new ServiceException(StateCode.ERROR_NOT_FOUND, "投票主题不存在");
        }

        // 检查当前用户是否是管理员或投票主题的创建者
        if (principle.getIsAdmin() == 0 && findResult.getCreatorId().longValue() != principle.getId().longValue()) {
            throw new ServiceException(StateCode.ERROR_FORBIDDEN, "不可编辑他人创建的投票主题");
        }

        // 检查投票主题是否已经开始
        if (findResult.getStartTime().isAfter(LocalDateTime.now())) {
            throw new ServiceException(StateCode.ERROR_CONFLICT, "不可编辑已经开始的投票");
        }

        // 检查传入参数中的开始时间和结束时间是否合理
        if (param.getStartTime().isAfter(param.getEndTime())) {
            throw new ServiceException(StateCode.ERROR_CONFLICT, "开始时间不能晚于结束时间");
        }

        // 创建一个新的投票主题对象
        VoteTopic voteTopicForUpdate = new VoteTopic();
        // 将传入的参数复制到投票主题对象中
        BeanUtils.copyProperties(param, voteTopicForUpdate);
        // 设置投票主题的ID
        voteTopicForUpdate.setId(id);

        // 更新投票主题，并返回更新结果
        return voteTopicMapper.updateById(voteTopicForUpdate);
    }

    @Override
    public VoteTopicSimpleVO selectSimpleInfoById(Long id) {
        VoteTopicSimpleVO findResult = voteTopicMapper.selectById(id);
        if (findResult == null) {
            throw new ServiceException(StateCode.ERROR_NOT_FOUND, "投票主题不存在");
        }

        return voteTopicMapper.selectById(id);
    }

    @Override
    public VoteTopicFullVO selectFullInfoById(Long id) {
        // 根据投票主题ID查询简单的信息
        VoteTopicSimpleVO voteTopicSimpleVO = selectSimpleInfoById(id);

        // 通过投票主题ID查询所有的投票选项信息
        List<VoteOptionSimpleVO> voteOptionSimpleVOList = voteOptionMapper.selectByVoteTopicId(id);

        // 创建完整的投票主题对象
        VoteTopicFullVO voteTopicFullVO = new VoteTopicFullVO();
        // 将简单的投票主题信息复制到完整的投票主题对象中
        BeanUtils.copyProperties(voteTopicSimpleVO, voteTopicFullVO);
        // 将投票选项列表设置到完整的投票主题对象中
        voteTopicFullVO.setOptions(voteOptionSimpleVOList);

        // 返回完整的投票主题对象
        return voteTopicFullVO;

    }

    @Override
    public List<VoteTopicSimpleVO> selectAll() {
        return voteTopicMapper.selectAll();
    }
}